package com.itheima.interceptor;

import com.itheima.utils.JwtUtils;
import com.itheima.utils.UserContext;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
@Slf4j
//拦截器实现HanderInterceptor接口重写方法进行操作
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        //1.获取请求url。
        String url = req.getRequestURL().toString();
        //2.判断请求url中是否包含login，如果包含，说明是登录操作，放行。
        if (url.contains("login")){
           log.info("登录操作，放行...");

            return true;
        }
//        3.获取请求头中的令牌（token）。
        String jwt = req.getHeader("token");

//        4.判断令牌是否存在，如果不存在，响应401。
        if (jwt == null){
            log.info("请求头token为空，返回401");
            resp.setStatus(401);
            return false;
        }
//        5.解析token，如果解析失败，响应401。
        if(jwt!= null){
            try {
                Claims claims = JwtUtils.parseJWT(jwt);
                Object id = claims.get("id");
                log.info("校验通过，当前线程：{}，当前登录用户id：{}" ,Thread.currentThread().getName(),id
                        );
                //1.调用setCurrentEmpId存入ThreadLocal,在线程中，当前线程的id和当前登录用户id一致
                UserContext.setCurrentEmpId(Integer.parseInt(id.toString()));
            }catch (Exception e){
                log.info("令牌解析失败，返回401");
                resp.setStatus(401);
                return false;
            }
        }
//        6。放行。
        log.info("令牌解析成功，放行");
       return  true;
    }
    //拦截器后置处理,移除ThreadLocal中的数据，进行remove操作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion后置处理...");
        UserContext.remove();
    }


}
